package gases.as3.librarys.core.net.cpp.bytes
{
	import flash.utils.ByteArray;
	
	public class BytesEncodeVOUtils
	{
		public function BytesEncodeVOUtils()
		{
		}
		/**
		 * 人物社会关系信息解析 
		 * @param bytes
		 * @return 
		 * 
		 */		
		public static function relationInfomationEncode(vo:Object):Object
		{
			var bytes:ByteArray = ByteArray(vo);
			var vo:Object = new Object();
			BytesUtil.write("btSetSex", bytes, BytesType.BYTE, BytesType.BYTE_LENGTH, vo["btSetSex"]);
			BytesUtil.write("btAge", bytes, BytesType.BYTE, BytesType.BYTE_LENGTH, vo["btAge"]);
			BytesUtil.write("btNation", bytes, BytesType.BYTE, BytesType.BYTE_LENGTH, vo["btNation"]);
			BytesUtil.write("btProvince", bytes, BytesType.BYTE, BytesType.BYTE_LENGTH, vo["btProvince"]);
			BytesUtil.write("btCity", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["btCity"]);
			BytesUtil.write("szSignature", bytes, BytesType.CHAR, 100, vo["szSignature"]);
			BytesUtil.write("wBirthYear", bytes, BytesType.BYTE, BytesType.BYTE_LENGTH, vo["wBirthYear"]);
			BytesUtil.write("bBirthMonth", bytes, BytesType.BYTE, BytesType.BYTE_LENGTH, vo["bBirthMonth"]);
			BytesUtil.write("bBirthDay", bytes, BytesType.BYTE, BytesType.BYTE_LENGTH, vo["bBirthDay"] );
			BytesUtil.write("bZodiac", bytes, BytesType.BYTE, BytesType.BYTE_LENGTH, vo["bZodiac"]);
			BytesUtil.write("bConstellation", bytes, BytesType.BYTE, BytesType.BYTE_LENGTH, vo["bConstellation"]);
			BytesUtil.write("btBloodType", bytes, BytesType.BYTE, BytesType.BYTE_LENGTH, vo["btBloodType"]);
			
			BytesUtil.write("szCellPhone", bytes, BytesType.CHAR, 30, vo["szCellPhone"]);
			BytesUtil.write("szQQ", bytes, BytesType.CHAR, 30, vo["szQQ"]);
			BytesUtil.write("szPhone", bytes, BytesType.CHAR, 30, vo["szPhone"]);
			BytesUtil.write("szMail", bytes, BytesType.CHAR, 30, vo["szMail"]);
			BytesUtil.write("szProfession", bytes, BytesType.CHAR, 30, vo["szProfession"]);
			BytesUtil.write("szSchool", bytes, BytesType.CHAR, 30, vo["szSchool"]);
			BytesUtil.write("btSecurity", bytes, BytesType.BYTE, BytesType.BYTE_LENGTH, vo["btSecurity"]);
			
			return vo;
		}
		
		/**
		 * 选择人物编码 
		 * @param bytes
		 * @return 
		 * 
		 */		
		public static function selectAvatarInfoEncode(vo:Object):ByteArray
		{
			var bytes:ByteArray = new ByteArray();
			
			BytesUtil.write('szName', bytes, BytesType.CHAR, 48, vo["szName"]);
			BytesUtil.write('nlevel',  bytes, BytesType.INT, BytesType.INT_LENGTH, vo["nlevel"]);
			BytesUtil.write('mapid',  bytes, BytesType.INT, BytesType.INT_LENGTH, vo["mapid"]);
			BytesUtil.write('countryId', bytes, BytesType.BYTE, BytesType.BYTE_LENGTH, vo["countryId"]);	
			BytesUtil.write('ngmlvl', bytes, BytesType.BYTE, BytesType.BYTE_LENGTH, vo["ngmlvl"]);
			
			BytesUtil.write('Feature',  bytes, BytesType.BYTES, 0, simpleFeatureEncode(vo["Feature"]));
			
			BytesUtil.write("dwUserOnlyId", bytes, BytesType.INT,  BytesType.INT_LENGTH,  vo["dwUserOnlyId"]);
			BytesUtil.write('btisdel', bytes, BytesType.BYTE, BytesType.BYTE_LENGTH, vo["btisdel"]);	 
			BytesUtil.write('posdeltime',  bytes, BytesType.INT, BytesType.INT_LENGTH, vo["posdeltime"]);	 
			BytesUtil.write('lastlogintime', bytes,  BytesType.INT, BytesType.INT_LENGTH, vo["lastlogintime"]);
			BytesUtil.write('remaindeltime', bytes,  BytesType.INT, BytesType.INT_LENGTH, vo["remaindeltime"]);
			BytesUtil.write('lastloginip', bytes, BytesType.BYTES, 4, vo["lastloginip"]);
			
			return bytes;
		}
		
		/**
		 * 人物形象编码
		 * @param bytes
		 * @return 
		 * 
		 */		
		public static function simpleFeatureEncode(vo:Object):ByteArray
		{
			var bytes:ByteArray = new ByteArray();
			
			BytesUtil.write('sex', bytes, BytesType.BYTE, BytesType.BYTE_LENGTH, vo["sex"]);
			BytesUtil.write('job',  bytes, BytesType.BYTE, BytesType.BYTE_LENGTH, vo["job"]);
			BytesUtil.write('hair',  bytes, BytesType.BYTE, BytesType.BYTE_LENGTH, vo["hair"]);
			BytesUtil.write('dwFacdid', bytes, BytesType.INT, BytesType.INT_LENGTH, vo["dwFacdid"]);	
			BytesUtil.write('weapon', bytes, BytesType.INT, BytesType.INT_LENGTH, vo["weapon"]);
			BytesUtil.write('dress', bytes, BytesType.INT, BytesType.INT_LENGTH, vo["dress"]);
			
			return bytes;
		}
		
		/**
		 *加点属性编码 
		 * @param vo
		 * @return 
		 * 
		 */		
		public static function abilityPointEncode(vo:Object):ByteArray
		{
			var bytes:ByteArray = new ByteArray();
			var addPoint:Array = vo["wAddAbilityPoint"] as Array;
			for(var i:int = 0; i < 5; i++)
			{
				BytesUtil.write('wAddAbilityPoint', bytes, BytesType.SHORT, BytesType.SHORT_LENGTH, addPoint[i]);
			}
			BytesUtil.write('wRemainPoint',  bytes, BytesType.SHORT, BytesType.SHORT_LENGTH, vo["wRemainPoint"]);
			return bytes;
		}
		
		/**
		 *道具所在格子位置 编码 
		 * @param vo
		 * @return 
		 * 
		 */		
		public static function itemLocationEncode(vo:Object):ByteArray
		{
			var bytes:ByteArray = new ByteArray();
			
			BytesUtil.write('btLocation', bytes,  BytesType.BYTE, BytesType.BYTE_LENGTH, vo["btLocation"]);
			BytesUtil.write('btTableID',  bytes,  BytesType.BYTE, BytesType.BYTE_LENGTH, vo["btTableID"]);
			BytesUtil.write('btIndex',  bytes,  BytesType.BYTE, BytesType.BYTE_LENGTH, vo["btIndex"]);
			
			return bytes;
		}
		/**
		 * 
		 * @param vo
		 * @return 
		 * 
		 */		
		public static function attackTargetEncode(vo:Object):ByteArray
		{
			var bytes:ByteArray = new ByteArray();
			
			BytesUtil.write('dwTmpId',  bytes,  BytesType.INT,  BytesType.INT_LENGTH,   vo["dwTmpId"]);
			BytesUtil.write('xDes',  bytes,  BytesType.SHORT,  BytesType.SHORT_LENGTH,  vo["xDes"]);  
			BytesUtil.write('yDes',  bytes,  BytesType.SHORT,  BytesType.SHORT_LENGTH,  vo["yDes"]);   
			
			return bytes;
		}
		
		/**
		 * 物品编码 
		 * @param vo
		 * @return 
		 * 
		 */		
		public static function itemEncode(vo:Object):ByteArray
		{
			var bytes:ByteArray = new ByteArray();
			
			//TODO: 用INT64UTIL来模拟一个STRING 当作INT64
			BytesUtil.write("i64ItemID", bytes, BytesType.INT64, BytesType.INT64_LENGTH, vo["i64ItemID"]);
			BytesUtil.write("dwBaseID", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["dwBaseID"]);
			BytesUtil.write("Location", bytes, BytesType.BYTES, 0, itemLocationEncode(vo["Location"]));
			BytesUtil.write("boIdent",  bytes, BytesType.BOOL, BytesType.BOOL_LENGTH, vo["boIdent"]);
			BytesUtil.write("nDura", bytes,  BytesType.INT, BytesType.INT_LENGTH, vo["nDura"]);
			BytesUtil.write("dwSoulIdx",  bytes, BytesType.INT,BytesType.INT_LENGTH, vo["dwSoulIdx"]);
			BytesUtil.write("btSoulToneUpIdx",  bytes, BytesType.BYTE, BytesType.BYTE_LENGTH, vo["btSoulToneUpIdx"]);
			BytesUtil.write("btSoulActiveType", bytes, BytesType.BYTE, BytesType.BYTE_LENGTH, vo["btSoulActiveType"]);
			//TODO: 乾坤5属性, 不确定是否需要再解析
			BytesUtil.write("xUniverseProperty", bytes, BytesType.BYTES, 30, vo["xUniverseProperty"]);
			BytesUtil.write("btFiveElementIdx",  bytes, BytesType.BYTE, BytesType.BYTE_LENGTH, vo["btFiveElementIdx"]);
			BytesUtil.write("btLockByPet",  bytes, BytesType.BYTE, BytesType.BYTE_LENGTH, vo["btLockByPet"]);
			BytesUtil.write("btUniverseCount",  bytes, BytesType.BYTE, BytesType.BYTE_LENGTH, vo["btUniverseCount"]);
			//凹槽
			BytesUtil.write("nHoleCount", bytes,  BytesType.BYTE, BytesType.BYTE_LENGTH, vo["nHoleCount"]);
			BytesUtil.write("dwHoleItemIdx0",  bytes, BytesType.INT, BytesType.INT_LENGTH, vo["dwHoleItemIdx0"] );
			BytesUtil.write("dwHoleItemIdx1",  bytes, BytesType.INT, BytesType.INT_LENGTH, vo["dwHoleItemIdx1"] );
			BytesUtil.write("dwHoleItemIdx2",  bytes, BytesType.INT, BytesType.INT_LENGTH, vo["dwHoleItemIdx2"]);
			BytesUtil.write("dwHoleItemIdx3",  bytes, BytesType.INT, BytesType.INT_LENGTH, vo["dwHoleItemIdx3"]);
			BytesUtil.write("dwHoleItemIdx4",  bytes, BytesType.INT, BytesType.INT_LENGTH, vo["dwHoleItemIdx4"]);
			//物品携带技能id，16个技能
			BytesUtil.write("nSkillIdx", bytes, BytesType.BYTES, 64, vo["nSkillIdx"] );
			BytesUtil.write("dwCount",  bytes, BytesType.INT, BytesType.INT_LENGTH, vo["dwCount"] );
			//绑定信息 0x01 普通绑定 0x02认主
			BytesUtil.write("btBinding",  bytes, BytesType.BYTE, BytesType.BYTE_LENGTH, vo["btBinding"]);
			BytesUtil.write("dwLuaData",  bytes, BytesType.BYTES, 32, vo["dwLuaData"] );
			BytesUtil.write("szMaker",  bytes, BytesType.CHAR, 48, vo["szMaker"] );
			BytesUtil.write("btQuality", bytes, BytesType.BYTE, BytesType.BYTE_LENGTH, vo["btQuality"]);
			BytesUtil.write("dwSaveExpBall", bytes, BytesType.INT, BytesType.INT_LENGTH,vo["dwSaveExpBall"]);
			BytesUtil.write("petData",  bytes, BytesType.BYTE, 260 , petDataEncode(vo["btBinding"]));
			BytesUtil.write("petAbility",  bytes, BytesType.BYTES, 80, petAbilityEncode(vo["petAbility"]) );
			
			
			return bytes;
		}
		
		/**
		 * 宠物数据编码 
		 * @param vo
		 * @return 
		 * 
		 */		
		public static function petDataEncode(vo:Object):ByteArray
		{
			var bytes:ByteArray = new ByteArray();
			var vo:Object = {};
			BytesUtil.write("i64TempId", bytes, BytesType.INT64, BytesType.INT64_LENGTH,vo["i64TempId"]);
			BytesUtil.write("i64NowExp", bytes, BytesType.INT64, BytesType.INT64_LENGTH, vo["i64NowExp"] );
			BytesUtil.write("i64OwnerItemId", bytes, BytesType.INT64, BytesType.INT64_LENGTH, vo["i64OwnerItemId"]);
			BytesUtil.write("monsterid", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["monsterid"]);
			BytesUtil.write("warIndex", bytes, BytesType.BYTE, BytesType.BYTE_LENGTH, vo["warIndex"]);
			BytesUtil.write("nowHP", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["nowHP"]);
			BytesUtil.write("nowMP", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["nowMP"]);
			//寿命
			BytesUtil.write("dwHrs", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["dwHrs"] );
			//排名
			BytesUtil.write("wRank", bytes, BytesType.SHORT, BytesType.SHORT_LENGTH, vo["wRank"]);
			BytesUtil.write("petprice", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["petprice"]);
			BytesUtil.write("dwSkillIdx", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["dwSkillIdx"] );
			//预留4字节
			BytesUtil.write("d1", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["d1"]);
			
			//TODO: 技能宠物 14字节长度* 16个 不知道还有用没
			var sAry:Array = vo["skills"] as Array;
			for(var i:int = 0; i< 16; i++)
			{
				var skill:Object;
				if(sAry[i])
				{
					skill = sAry[i];
				}
				else
				{
					skill = new Object();
				}
				BytesUtil.write("skills", bytes, BytesType.BYTES, 14 ,  petSkillInfoEncode(skill));
			}
			BytesUtil.write("szName", bytes, BytesType.CHAR,48, vo["szName"] );
			BytesUtil.write("abilityBase", bytes, BytesType.CHAR,48, monsterAbilityBaseEncode(vo["abilityBase"] ) );
			return bytes;
			
		}
		
		/**
		 * 宠物技能编码 
		 * @param vo
		 * @return 
		 * 
		 */		
		public static function petSkillInfoEncode(vo:Object):ByteArray
		{
			var bytes:ByteArray = new ByteArray();
			var lvl:Object = vo["skills"];
			if(!lvl)
				lvl = new Object();
			BytesUtil.write("szName", bytes, BytesType.BYTES,12, skillLvEncode(lvl) );
			BytesUtil.write("btbind", bytes, BytesType.BYTE, BytesType.BYTE_LENGTH, vo["btbind"] );
			BytesUtil.write("btBindId", bytes, BytesType.BYTE, BytesType.BYTE_LENGTH, vo["btBindId"] );
			return bytes;
		}
		
		/**
		 * 技能等级编码 
		 * @param vo
		 * @return 
		 * 
		 */		
		public static function skillLvEncode(vo:Object):ByteArray
		{
			var bytes:ByteArray = new ByteArray();
			BytesUtil.write("skillid", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["skillid"] );
			BytesUtil.write("level", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["level"] );
			BytesUtil.write("dwexp", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["dwexp"] );
			return bytes;
		}
		
		/**
		 * 资质编码 
		 * @param vo
		 * @return 
		 * 
		 */		
		public static function monsterAbilityBaseEncode(vo:Object):ByteArray
		{
			var bytes:ByteArray = new ByteArray();
			BytesUtil.write("wlevel", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["wlevel"] );
			BytesUtil.write("abilitypoint", bytes, BytesType.BYTES, 12, abilityPointEncode(vo["abilitypoint"]) );
			BytesUtil.write("btLoyalty", bytes, BytesType.BYTE, BytesType.BYTE_LENGTH, vo["btLoyalty"] );
			BytesUtil.write("btSavvy", bytes, BytesType.BYTE, BytesType.BYTE_LENGTH, vo["btSavvy"] );
			BytesUtil.write("nQualityofHP", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["nQualityofHP"] );
			BytesUtil.write("nQualityofMP", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["nQualityofMP"] );
			BytesUtil.write("nQualityofHit", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["nQualityofHit"] );
			BytesUtil.write("nQualityofSkillHit", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["nQualityofSkillHit"] );
			BytesUtil.write("nQualityofSente", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["nQualityofSente"] );
			BytesUtil.write("nQualityofDef", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["nQualityofDef"] );
			BytesUtil.write("nQualityofSkillDef", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["nQualityofSkillDef"] );
			BytesUtil.write("nQualityofBackHit", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["nQualityofBackHit"] );
			BytesUtil.write("nQualityofHitRatio", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["nQualityofHitRatio"] );
			BytesUtil.write("nQualityofBigHit", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["nQualityofBigHit"] );
			BytesUtil.write("nQualityofJouk", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["nQualityofJouk"] );
			BytesUtil.write("nQualityofJoukBigRatio", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["nQualityofJoukBigRatio"] );
			BytesUtil.write("nQualityofAntiCachet", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["nQualityofAntiCachet"] );
			BytesUtil.write("nRateofGrowth", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["nRateofGrowth"] );
			
			return bytes;
		}
		
		/**
		 * 战将属性编码 
		 * @param vo
		 * @return 
		 * 
		 */		
		public static function petAbilityEncode(vo:Object):ByteArray
		{
			var bytes:ByteArray = new ByteArray();
			BytesUtil.write("dwMaxHP", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["dwMaxHP"]);
			BytesUtil.write("dwMaxMP", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["dwMaxMP"]);
			BytesUtil.write("dwRoundAddHP", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["dwRoundAddHP"]);
			BytesUtil.write("dwRoundAddMP", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["dwRoundAddMP"]);
			BytesUtil.write("nDC", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["nDC"]);
			BytesUtil.write("nMC", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["nMC"]);
			BytesUtil.write("nAC", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["nAC"]);
			BytesUtil.write("nMAC", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["nMAC"]);
			BytesUtil.write("nFirstAttack", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["nFirstAttack"]);
			BytesUtil.write("nBackHit", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["nBackHit"]);
			BytesUtil.write("nNicety", bytes, BytesType.INT,  BytesType.INT_LENGTH, vo["nNicety"]);
			BytesUtil.write("nBigHit", bytes, BytesType.INT,  BytesType.INT_LENGTH, vo["nBigHit"]);
			BytesUtil.write("nAntiBigHit", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["nAntiBigHit"]);
			BytesUtil.write("nCachet", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["nCachet"]);
			BytesUtil.write("nAntiCachet", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["nAntiCachet"]);
			BytesUtil.write("nElementAttackRating", bytes,  BytesType.INT, BytesType.INT_LENGTH, vo["nElementAttackRating"]);
			BytesUtil.write("nElementDefenceRating", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["nElementDefenceRating"]);
			BytesUtil.write("nElementHpRating", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["nElementHpRating"]);
			BytesUtil.write("nElementNicetyRating", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["nElementNicetyRating"]);
			BytesUtil.write("nElementJuckRating", bytes, BytesType.INT, BytesType.INT_LENGTH, vo["nElementJuckRating"]);
			
			return bytes;
			
		}
		/** 
		 *队伍基本信息  
		 * @param vo 
		 * @return  
		 *  
		 */              
		public static function teamBaseInfoEncode(vo:Object):ByteArray 
		{ 
			var bytes:ByteArray = new ByteArray(); 
			
			BytesUtil.write('szGroupName',  bytes,  BytesType.CHAR,  48,   vo["szGroupName"]); 
			BytesUtil.write('szGroupMaster',  bytes,  BytesType.CHAR,  48,  vo["szGroupMaster"]);   
			BytesUtil.write('szGroupDiscribe',  bytes,  BytesType.CHAR,  100,  vo["szGroupDiscribe"]);  
			BytesUtil.write('wMaze',  bytes,  BytesType.SHORT,  BytesType.SHORT_LENGTH,   vo["wMaze"]); 
			BytesUtil.write('btCount',  bytes,  BytesType.BYTE,  BytesType.BYTE_LENGTH,  vo["btCount"]);  
			var byte:ByteArray=teamNeedEncode(vo["condition"]); 
			BytesUtil.write('condition',  bytes,  BytesType.BYTES,  0,  byte);  
			
			return bytes; 
		} 
		
		/** 
		 *队伍需求  
		 * @param vo 
		 * @return  
		 *  
		 */              
		public static function teamNeedEncode(vo:Object):ByteArray 
		{ 
			var bytes:ByteArray = new ByteArray(); 
			
			BytesUtil.write('dwMinJoinLevel',  bytes,  BytesType.INT,  BytesType.INT_LENGTH,   vo["dwMinJoinLevel"]); 
			BytesUtil.write('dwMaxJoinLevel',  bytes,  BytesType.INT,  BytesType.INT_LENGTH,  vo["dwMaxJoinLevel"]);   
			BytesUtil.write('boAutoAllow',  bytes,  BytesType.BOOL,  BytesType.BOOL_LENGTH,  vo["boAutoAllow"]);  
			
			return bytes; 
		} 
		
	}
}
















